#include "Gnome.h"

#include <iomanip>

#include <boost/assign/list_of.hpp>

using namespace std;
using namespace boost::assign;

const unsigned Gnome::nbrEnsembles = 3;

const unsigned Gnome::nbrCapacites = 7;

const unsigned Gnome::ppAlloues = 45;

const vector< vector< unsigned > > Gnome::ensembleRacial =
  list_of< vector< unsigned > >
  ( list_of( 1)( 7)( 6)( 3)( 4) )         // forêts
  ( list_of(15)(11)(12)( 3)( 8)( 4)( 9) ) // svirfneblins
  ( list_of(12)( 3)( 8)( 4) );            // rochers

const unsigned Gnome::taille = 16;

/**
 * Contient les capacités, puis les ensembles raciaux, à la fin.
 */
const vector< CapaciteRaciale > Gnome::Liste = list_of
  (CapaciteRaciale("Amitié avec les animaux"    , 10))
  (CapaciteRaciale("Bonus d'ingénieurie"        ,  5))
  (CapaciteRaciale("Bonus au contact"           , 10))
  (CapaciteRaciale("Bonus aux JS"               ,  5))
  (CapaciteRaciale("Bonus défensif"             ,  5))
  (CapaciteRaciale("Camouflage"                 , 10))
  (CapaciteRaciale("Déplacement forestier"      , 10))
  (CapaciteRaciale("Détection minière"          , 10))
  (CapaciteRaciale("Furtivité"                  , 10))
  (CapaciteRaciale("Identification des potions" ,  5))
  (CapaciteRaciale("Immobilité"                 , 10))
  (CapaciteRaciale("Infravision"                , 10))
  (CapaciteRaciale("Talent pour les dagues"     ,  5))
  (CapaciteRaciale("Talent aux épées courtes"   ,  5))
  (CapaciteRaciale("Talents pour les fléchettes",  5))
  (CapaciteRaciale("Talent pour la fronde"      ,  5));

/**
 * Contient la liste des ensembles raciaux..
 */
const vector< EnsembleCapacitesRaciales > Gnome::Ensembles = list_of
  ( EnsembleCapacitesRaciales( "Gnome des Forêts"           , 45, ensembleRacial[0] ) )
  ( EnsembleCapacitesRaciales( "Gnome des Profondeurs"      , 45, ensembleRacial[1] ) )
  ( EnsembleCapacitesRaciales( "Gnome des Rochers"          , 40, ensembleRacial[2] ) );

const vector< Prerequis > Gnome::Limites = list_of
  ( Prerequis( 0, 6, 18 ) )
  ( Prerequis( 2, 8, 18 ) )
  ( Prerequis( 3, 6, 18 ) );

/**
 * Les Gnomes ont +1 en Intelligence et -1 en Sagesse
 */
const map< unsigned, int > Gnome::AjustTraits = map_list_of
  ( 3, 1 )
  ( 4, -1 );

/**
 * Constructeur simplifié, qui remplit simplement le conteneur des capacités.
 * Il est utilisé lors de la lecture d'un fichier XML.
 *
 * @param[in] cap conteneur des capacité
 */
Gnome::Gnome(const vector<unsigned>& cap)
  :Race("Gnome")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  Capacites.assign( cap.begin(), cap.end() );
}

/**
 * Constructeur usuel, qui permet de créer un Gnome en sélectionnant
 * ses capacités.
 *
 * @param[in] PP nombre de pp, passé en argument afin de pouvoir
 * récupérer les pp non dépensé
 */
Gnome::Gnome(unsigned& PP)
  :Race("Gnome")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;

  blank() << setfill('*') << setw(56) << '*' << endmsg;
  blank() << "Création d'un gnome" << endmsg << endmsg;

  PP += 45;
  construitRace( PP );
  
  blank() << endmsg << setfill('*') << setw(56) << '*' << endmsg;
}

Gnome::Gnome()
  :Race("Gnome")
{
  NombrePPsAlloues = ppAlloues;

  CapacitesRaciales    = Liste;
  NombreTotalCapacites = taille;
  EnsemblesRaciaux     = Ensembles;
  NombreTotalEnsembles = nbrEnsembles;
  NombreMaxCapacites   = nbrCapacites;
  PrerequisRaciaux     = Limites;

  AjustementsRaciaux = AjustTraits;
}

/**
 * Constructeur de "copie", qui permet de créer une instance à partir
 * de MetaClasse.
 *
 * @param[in] ptr pointeur sur l'instance à copier.
 */
Gnome::Gnome(Race *ptr)
  : Race( *ptr )
{}

/**
 * Destructeur, ne fait rien de spécial.
 */
Gnome::~Gnome()
{}
